//第一题 买卖股票的最佳时机

// 给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。
// 你可以尽可能地完成更多的交易（多次买卖一支股票）。

// 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。

// 测试用例
// 输入: [7,1,5,3,6,4] 输出 =>  7

// -1 + 5 - 3 + 6 = 7

// 解释: 在第 2 天（股票价格 = 1）的时候买入，在第 3 天（股票价格 = 5）的时候
// 卖出, 这笔交易所能获得利润 = 5-1 = 4 。

// const maxProfitMore = function (arr: number[]) {
// 	// 算法
// 	// const len = arr.length
// 	// // 奇数还是偶数
// 	// // 真  偶数 
// 	// // 假  奇数
// 	// const flag = len % 2 === 0 
// 	let price = 0;
// 	const list: number[] = []
// 	// 控制第几次进来买入
// 	arr.forEach((v, i) => {
// 		price = 0
// 		// 控制每一次的操作

// 		arr.forEach((item, index) => {
// 			// 保证当前操作不可以是前一天
// 			if (index >= i) {

// 				// 买入
// 				if (i % 2 === index % 2) {
// 					price -= item
// 				}

// 				// 卖出
// 				if (i % 2 !== index % 2) {
// 					price += item
// 				}
// 			}
// 		})

// 		list.push(price)
// 	})

// 	console.log(list);
// };

// const ss = maxProfitMore([7, 1, 5, 3, 6, 4])

// console.log(ss);

// 1 -
// 	2 + -
// 	3 - +  -
// 	4 + -  +
// 	5 - +  -




// 	5  0




//第二题 旋转数组

// 给定一个数组，将数组中的元素向右移动 k 个位置，其中 k 是非负数。


// 测试用例
// 输入: 输入: [1,2,3,4,5,6,7] 和 k = 3  输出 => [5,6,7,1,2,3,4]

// 解释:
// 向右旋转 1 步: [7,1,2,3,4,5,6]
// 向右旋转 2 步: [6,7,1,2,3,4,5]
// 向右旋转 3 步: [5,6,7,1,2,3,4]

// var rotate = function (arr: number[], k: number): number[] {
// 	for (let i = 0; i < k; i++) {
// 		// pop  返回的类型 number | undefined
// 		const lastItem = arr.pop()

// 		// 类型断言
// 		// arr.unshift(lastItem as number)
// 		// 类型保护
// 		if (typeof lastItem === 'number') {
// 			// 需要判断才可以推入
// 			arr.unshift(lastItem)
// 		}
// 	}
// 	return arr
// };

// const s = rotate([1, 2, 3, 4, 5, 6, 7], 3)
// console.log(s);



//第三题 存在重复

// 给定一个整数数组，判断是否存在重复元素。如果任何值在数组中出现至少两次，函数返回 true。
// 如果数组中每个元素都不相同，则返回 false。

// 测试用例
// 输入: [1,2,3,1] 输出 => true



// var containsDuplicate = function (arr: number[]): boolean {
// 	// 方式一
// 	// return arr.length !== [...new Set(arr)].length
// 	// 方式二
// 	return arr.some((v, i) => {
// 		// 利用正向查找下标 和 逆向查找下标 判断是否一致
// 		return i !== arr.lastIndexOf(v)
// 	})
// };

// const s = containsDuplicate([1, 2, 3, 1])
// console.log(s);


//第四题 只出现一次的数字

// 给定一个非空整数数组，除了某个元素只出现一次以外，
// 其余每个元素均出现两次。找出那个只出现了一次的元素。

// 测试用例
// 输入: [2,2,3] 输出 => 3

export const singleNumber = function (arr: number[]): number {
	// 查找数组所在项
	const result = arr.find((v, i) => {
		// 找到数组正向查找 和 逆向查找所在下标一样的项
		// 说明数组中只要唯一的一项
		return arr.indexOf(v) === arr.lastIndexOf(v)
	})
	// 类型断言
	return result as number

};


